package tp.pr5.mv.window;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JPanel;

import tp.pr5.mv.CPU;
import tp.pr5.mv.Controller;
import tp.pr5.mv.Instruction;
import tp.pr5.mv.Memory;
import tp.pr5.mv.OperandStack;
import tp.pr5.mv.ProgramCounter;
import tp.pr5.mv.ProgramMV;

@SuppressWarnings("serial")
public class PanelWrite extends JPanel implements CPU.Observer {

	/* Panel con un boton write que permite escribir en la memoria de la CPU a partir de los datos escritos
	 * en el PanelPosValMemoria. Además también se dispone de un modelo de la tabla para repintar la memoria
	 * de la ventana cuando se pulse el boton write
	 * 
	 * */
	private JButton write;
	
	public PanelWrite(PanelPosValMemoria panelPosValMemoria, Controller controller) {
		
		super( new FlowLayout() ); 
		init(panelPosValMemoria, controller);
		
	}
	
	public void init(final PanelPosValMemoria panelPosValMemoria, final Controller controller) {
		
		write = new JButton("Write");
		write.addActionListener( new ActionListener() { 

			@Override
			public void actionPerformed(ActionEvent e) { // Escribimos en la memoria de la CPU y mandamos refrescar la memoria de la ventana gráfica 
				
				try {
					controller.requestWrite(panelPosValMemoria.getPosField(), panelPosValMemoria.getValField());
				}
				catch ( java.lang.NumberFormatException ex ) {
					/// No queremos que la máquina haga nada en esta situación.
				}
				
			}
			
			
			
		});
		add( write );
		
		
	}

	@Override
	public void onStartInstrExecution(Instruction ins) {}

	@Override
	public void onEndInstrExecution(Instruction instr, Memory mem,
			OperandStack stack, ProgramCounter pc) {}

	@Override
	public void onHalt() {}

	@Override
	public void onReset(ProgramMV program) {}

	@Override
	public void onStartRun() {
		write.setEnabled(false);
	}

	@Override
	public void onEndRun(boolean aborted) {
		write.setEnabled(true);
	}

	@Override
	public void onTrap(Instruction instr, String trapMessage) {}
	
}
